package packfile

import (
	"bytes"
	"compress/gzip"
	"fmt"
	"io"
)

// Compress 压缩任意字节切片，返回gzip压缩结果
func Compress(data []byte) ([]byte, error) {
	// 创建字节缓冲区用于存储压缩后的数据
	var buf bytes.Buffer
	// 创建gzip压缩写入器
	gz := gzip.NewWriter(&buf)
	// 写入原始数据进行压缩
	if _, err := gz.Write(data); err != nil {
		return nil, fmt.Errorf("压缩数据时出错: %v", err)
	}
	// 关闭压缩器以确保所有数据都被写入
	if err := gz.Close(); err != nil {
		return nil, fmt.Errorf("关闭压缩器时出错: %v", err)
	}
	// 返回压缩后的字节数据
	return buf.Bytes(), nil
}

// Decompress 解压任意gzip压缩的字节切片，返回解压结果
func Decompress(data []byte) ([]byte, error) {
	// 创建字节读取器
	buf := bytes.NewReader(data)
	// 创建gzip解压读取器
	gz, err := gzip.NewReader(buf)
	if err != nil {
		return nil, fmt.Errorf("创建解压读取器时出错: %v", err)
	}
	// 确保在函数结束时关闭解压器
	defer gz.Close()
	// 读取所有解压后的数据并返回
	return io.ReadAll(gz)
}
